#include <stdio.h>
#include <setjmp.h>
#include <assert.h>
#include <stdlib.h>
#include <stddef.h>

#include "hw.h"

#define EXIT_SUCCESS 0

enum ctx_state_e {FINI, ACTIF, INITIAL};/*INITIAL : pret a executer , ACTIF : en train d'executer , FINI : fin d'executer ou bloquer */


typedef void (func_t)(void *);	/* une fonction return rien, le pointeur d'argument pointe sur void pour que tous les types attendus soient possibles */



/* cette structure stocke tous les informations du contexte de processus */
struct ctx_s
{
	void *esp;	/* la sommet de la pile d'execution -> stack pointer */
	void *ebp;	/* la base de la pile d'excution -> base pointer */
	enum ctx_state_e etat; /* ceci stocke l'etat courant du processus */
	void *stack_size;	/* pointe sur le stack */
	void *stack;
	void *args;	/* qui pointe sur l'argument de la function*/
	func_t *f;	/* qui pointe sur la fonction */
	struct ctx_s *next;	/* next est un pointeur lie a la prochaine contexte */
	struct ctx_s *next_sem;	/* next_sem pointe sur le prochain context qui bloque dans cette semaphore */
};


static struct ctx_s *current_ctx = NULL;
static struct ctx_s *first_ctx = NULL;

/* cette struture decrit le semaphore */
struct sem_s
{
	unsigned int cpt;
	struct ctx_s* ctx;
};


/* interface pour utilisateurs */
int create_ctx(int stack_size, func_t f, void *args);
void start_sched();

